/**
 * @copyright Copyright (c) 2025 CSG Digital Grid Technology (Guangdong) Co., Ltd.
 * @author Chen Yongjie
 */
#ifndef __TEST_UNIT_H
#define __TEST_UNIT_H

/**
 * @brief 测试get_token函数在正常情况下的行为
 * 
 * 测试目标：验证函数是否能正确生成递增的token
 * 测试步骤：
 * 1. 多次调用get_token函数
 * 2. 验证返回的token是否按预期递增
 */
void test_get_token_normal(void);

/**
 * @brief 测试get_token函数在种子值接近最大值时的行为
 * 
 * 测试目标：验证当plc_tokenSeed接近65535时的处理
 * 测试步骤：
 * 1. 设置plc_tokenSeed接近最大值
 * 2. 调用get_token函数
 * 3. 验证是否正确重置为0
 */
void test_get_token_max_value(void);

/**
 * @brief 测试get_token函数对空指针的处理
 * 
 * 测试目标：验证函数对NULL指针参数的处理
 * 测试步骤：
 * 1. 使用NULL指针调用函数
 * 2. 验证函数的健壮性
 */
void test_get_token_null_pointer(void);

/**
 * @brief 测试itobcd函数在正常范围内的转换
 * 
 * 测试目标：验证函数是否能正确将0-99范围内的整数转换为BCD码
 * 测试步骤：
 * 1. 测试边界值（0、9、10、99）
 * 2. 测试常规值
 */
void test_itobcd_normal_range(void);

/**
 * @brief 测试itobcd函数对特殊值的处理
 * 
 * 测试目标：验证函数对超出正常范围值的处理
 * 测试步骤：
 * 1. 测试大于99的值
 * 2. 验证返回值的合理性
 */
void test_itobcd_special_values(void);

/**
 * @brief 测试get_system_time_us函数的功能
 * 
 * 测试目标：验证函数是否能正确获取系统微秒级时间戳
 * 测试步骤：
 * 1. 调用函数获取时间戳
 * 2. 验证返回值的合理性
 */
void test_get_system_time_us_normal(void);

/**
 * @brief 测试get_system_time_absoffset函数在正常情况下的行为
 * 
 * 测试目标：验证函数是否能正确计算两个时间戳的差值
 * 测试步骤：
 * 1. 使用不同的时间戳值进行测试
 * 2. 验证计算结果的正确性
 */
void test_get_system_time_absoffset_normal(void);

/**
 * @brief 测试get_system_time_absoffset函数在时间戳溢出情况下的行为
 * 
 * 测试目标：验证函数在时间戳溢出时的处理是否正确
 * 测试步骤：
 * 1. 使用接近最大值的时间戳进行测试
 * 2. 验证溢出处理的正确性
 */
void test_get_system_time_absoffset_overflow(void);

/**
 * @brief 测试AtoH函数在正常情况下的行为
 * 
 * 测试目标：验证函数是否能正确将十六进制字符串转换为字节数组
 * 测试步骤：
 * 1. 测试有效的十六进制字符串
 * 2. 验证转换结果是否正确
 */
void test_AtoH_normal(void);

/**
 * @brief 测试AtoH函数处理空指针的情况
 * 
 * 测试目标：验证函数对NULL指针参数的处理
 * 测试步骤：
 * 1. 使用NULL指针作为输入或输出参数
 * 2. 验证函数返回值是否为0
 */
void test_AtoH_null_pointer(void);

/**
 * @brief 测试AtoH函数处理空字符串的情况
 * 
 * 测试目标：验证函数对空字符串的处理
 * 测试步骤：
 * 1. 使用空字符串作为输入
 * 2. 验证函数返回值是否为0
 */
void test_AtoH_empty_string(void);

/**
 * @brief 测试AtoH函数处理奇数长度字符串的情况
 * 
 * 测试目标：验证函数对奇数长度十六进制字符串的处理
 * 测试步骤：
 * 1. 使用奇数长度的十六进制字符串
 * 2. 验证最后一个字节的处理是否正确
 */
void test_AtoH_odd_length(void);

/**
 * @brief 测试mqtt_get_time函数的正常行为
 * 
 * 测试目标：验证函数是否能正确生成时间戳字符串
 * 测试步骤：
 * 1. 调用mqtt_get_time获取时间戳
 * 2. 验证时间戳格式是否正确
 * 3. 验证时间戳的值是否在合理范围内
 */
void test_mqtt_get_time_normal(void);

/**
 * @brief 测试mqtt_get_time函数对空指针的处理
 * 
 * 测试目标：验证函数对NULL指针参数的处理
 * 测试步骤：
 * 1. 使用NULL指针调用函数
 * 2. 验证函数的健壮性
 */
void test_mqtt_get_time_null_pointer(void);

/**
 * @brief 测试delay_ms函数的正常行为
 * 
 * 测试目标：验证函数是否能正确延时指定的毫秒数
 * 测试步骤：
 * 1. 记录开始时间
 * 2. 调用delay_ms函数
 * 3. 记录结束时间
 * 4. 验证实际延时是否接近预期值
 */
void test_delay_ms_normal(void);

/**
 * @brief 测试delay_ms函数在不同延时值下的行为
 * 
 * 测试目标：验证函数在不同延时值下的准确性
 * 测试步骤：
 * 1. 测试多个不同的延时值
 * 2. 验证每个延时的准确性
 */
void test_delay_ms_various_delays(void);

/**
 * @brief 测试get_current_time_global函数的正常行为
 * 
 * 测试目标：验证函数是否能正确生成格式化的时间戳字符串
 * 测试步骤：
 * 1. 调用get_current_time_global获取时间戳
 * 2. 验证时间戳格式是否正确（YYYY-MM-DDThh:mm:ss.000+0800）
 * 3. 验证时间戳的各个部分是否在合理范围内
 */
void test_get_current_time_global_normal(void);

/**
 * @brief 测试get_current_time_global函数对空指针的处理
 * 
 * 测试目标：验证函数对NULL指针参数的处理
 * 测试步骤：
 * 1. 使用NULL指针调用函数
 * 2. 验证函数返回值是否正确
 */
void test_get_current_time_global_null_pointer(void);

/**
 * @brief 测试get_system_time_absoffset函数在正常情况下的行为
 * 
 * 测试目标：验证函数在不同时间戳组合下的计算正确性
 * 测试步骤：
 * 1. 测试current > last的情况
 * 2. 测试current = last的情况
 * 3. 验证计算结果的准确性
 */
void test_get_system_time_absoffset_normal(void);

/**
 * @brief 测试get_system_time_absoffset函数在时间戳溢出情况下的行为
 * 
 * 测试目标：验证函数在时间戳溢出时的处理是否正确
 * 测试步骤：
 * 1. 使用接近最大值的时间戳作为last参数
 * 2. 使用较小值作为current参数
 * 3. 验证溢出处理的正确性
 */
void test_get_system_time_absoffset_overflow(void);

/**
 * @brief 测试 get_token 函数在高频调用时的行为
 * 
 * 测试目标：验证函数在高频连续调用时的正确性
 * 测试步骤：
 * 1. 快速连续调用函数多次
 * 2. 验证生成的token序列
 * 3. 检查种子值变化
 * 
 * 预期结果：
 * 1. 每个token应该唯一
 * 2. 种子值应正确递增
 * 3. 不应出现竞态条件
 */
void test_get_token_rapid_calls(void);

/**
 * @brief 测试 itobcd 函数在连续值序列上的行为
 * 
 * 测试目标：验证函数对连续数值的转换正确性
 * 测试步骤：
 * 1. 测试连续的数值范围
 * 2. 验证BCD转换结果
 * 
 * 预期结果：
 * 1. 所有转换结果应符合BCD格式
 * 2. 结果应在预期范围内
 */
void test_itobcd_sequence(void);

/**
 * @brief 测试 delay_ms 函数在极短延时情况下的行为
 * 
 * 测试目标：验证函数对极短延时的处理能力
 * 测试步骤：
 * 1. 使用极短的延时值
 * 2. 测量实际延时时间
 * 
 * 预期结果：
 * 1. 函数应能处理极短延时
 * 2. 实际延时应接近预期值
 */
void test_delay_ms_short_delays(void);

/**
 * @brief 测试 mqtt_get_time 函数在时区变更情况下的行为
 * 
 * 测试目标：验证函数在不同时区下的正确性
 * 测试步骤：
 * 1. 保存原始时区
 * 2. 修改系统时区
 * 3. 获取时间戳
 * 4. 恢复原始时区
 * 
 * 预期结果：
 * 1. 时间戳格式应保持一致
 * 2. 时间值应反映正确时区
 */
void test_mqtt_get_time_timezone_change(void);

#endif /* __TEST_UNIT_H */